﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

namespace MoreMountains.NiceVibrations
{
	public class NiceVibrationsDemoManager : MonoBehaviour 
	{
		/// a text object in the demo scene in which debug information will be displayed
		public Text DebugTextBox;

		protected string _debugString;
		protected string _platformString;
		protected const string _CURRENTVERSION = "1.2";

		/// <summary>
		/// On Awake, we initialize our iOS haptics.
		/// Of course, this only needs to be done when on iOS, or targeting iOS. 
		/// A test will be done and this method will do nothing if running on anything else
		/// </summary>
		protected virtual void Awake()
		{
			MMVibrationManager.iOSInitializeHaptics ();
		}

		/// <summary>
		/// On Start, we display our debug information
		/// </summary>
		protected virtual void Start()
		{
			DisplayInformation ();
		}

		/// <summary>
		/// Displays the debug information (API version on Android, iOS sdk version, and error message otherwise)
		/// </summary>
		protected virtual void DisplayInformation()
		{
			if (MMVibrationManager.Android ())
			{
				_platformString = "API version " + MMVibrationManager.AndroidSDKVersion().ToString();
			} 
			else if (MMVibrationManager.iOS ())
			{
				_platformString = "iOS " + MMVibrationManager.iOSSDKVersion(); 
			} 
			else
			{
				_platformString = Application.platform + ", not supported by Nice Vibrations for now.";
			}

			DebugTextBox.text = "Platform : " + _platformString + "\n Nice Vibrations v" + _CURRENTVERSION;
		}

		/// <summary>
		/// On Disable, we release our iOS haptics (to save memory and avoid garbage).
		/// Of course, this only needs to be done when on iOS, or targeting iOS. 
		/// A test will be done and this method will do nothing if running on anything else
		/// </summary>
		protected virtual void OnDisable()
		{
			MMVibrationManager.iOSReleaseHaptics ();
		}

		/// <summary>
		/// The following methods are bound (via the inspector) to buttons in the demo scene, and will call the corresponding vibration methods
		/// </summary>

		/// <summary>
		/// Triggers the default Unity vibration, without any control over duration, pattern or amplitude
		/// </summary>
		public virtual void TriggerDefault()
		{
			#if UNITY_IOS || UNITY_ANDROID
				Handheld.Vibrate ();	
			#endif
		}

		/// <summary>
		/// Triggers the default Vibrate method, which will result in a medium vibration on Android and a medium impact on iOS
		/// </summary>
		public virtual void TriggerVibrate()
		{
			MMVibrationManager.Vibrate ();
		}

		/// <summary>
		/// Triggers the selection haptic feedback, a light vibration on Android, and a light impact on iOS
		/// </summary>
		public virtual void TriggerSelection()
		{
			MMVibrationManager.Haptic (HapticTypes.Selection);
		}

		/// <summary>
		/// Triggers the success haptic feedback, a light then heavy vibration on Android, and a success impact on iOS
		/// </summary>
		public virtual void TriggerSuccess()
		{
			MMVibrationManager.Haptic (HapticTypes.Success);
		}

		/// <summary>
		/// Triggers the warning haptic feedback, a heavy then medium vibration on Android, and a warning impact on iOS
		/// </summary>
		public virtual void TriggerWarning()
		{
			MMVibrationManager.Haptic (HapticTypes.Warning);
		}

		/// <summary>
		/// Triggers the failure haptic feedback, a medium / heavy / heavy / light vibration pattern on Android, and a failure impact on iOS
		/// </summary>
		public virtual void TriggerFailure()
		{
			MMVibrationManager.Haptic (HapticTypes.Failure);
		}

		/// <summary>
		/// Triggers a light impact on iOS and a short and light vibration on Android.
		/// </summary>
		public virtual void TriggerLightImpact()
		{
			MMVibrationManager.Haptic (HapticTypes.LightImpact);
		}

		/// <summary>
		/// Triggers a medium impact on iOS and a medium and regular vibration on Android.
		/// </summary>
		public virtual void TriggerMediumImpact()
		{
			MMVibrationManager.Haptic (HapticTypes.MediumImpact);
		}

		/// <summary>
		/// Triggers a heavy impact on iOS and a long and heavy vibration on Android.
		/// </summary>
		public virtual void TriggerHeavyImpact()
		{
			MMVibrationManager.Haptic (HapticTypes.HeavyImpact);
		}
	}
}